﻿// copyright (c) 2025 author:fio66<fio66@foxmail.com>. All rights reserved.
// date: 2025-08-21 14:06:31

#ifndef _FFMPEG_WRAPPER_SRC_FFMPEG_WARPPER_EXPORT_H_
#define _FFMPEG_WRAPPER_SRC_FFMPEG_WARPPER_EXPORT_H_

#include <cstdint>
#include <functional>
#include <memory>
#include <optional>
#include <span>
#include <string>
#include <string_view>
#include <variant>

namespace fio66 {
// 音频信息结构体
enum class MediaType { kAudio, kVideo };

struct AudioInfo {
  int32_t sample_rate;     // 采样率
  int32_t channels;        // 声道数
  int32_t bit_depth;       // 采样位数
  std::string codec_name;  // 编解码器名称
};

struct VideoInfo {
  int32_t width;           // 宽度
  int32_t height;          // 高度
  double frame_rate;       // 帧率
  std::string codec_name;  // 编解码器名称
};

enum class MediaDataType {
  kMediaDataStart = 0,
  kMediaDataEnd,
  kVideoData,
  kAudioData
};

class MediaDataCallback {
 public:
  virtual ~MediaDataCallback() = default;

  virtual void OnRecieveMediaData(MediaDataType type, uint8_t* data,
                                  size_t size) = 0;
};

class Demuxer {
 public:
  virtual ~Demuxer() = default;
  virtual bool Demuxing(std::string_view url, MediaDataCallback* callback) = 0;
  virtual void PauseDemuxing() = 0;   // 暂停解复用
  virtual void ResumeDemuxing() = 0;  // 恢复解复用
  virtual void QuitDemuxing() = 0;    // 退出解复用

  // 获取媒体信息，根据传入的type返回对应的信息
  virtual std::optional<std::variant<AudioInfo, VideoInfo>> GetMediaInfo(
      MediaType type) = 0;

  // 进度控制
  virtual double GetCurrentPosition() = 0;   // 获取当前播放进度，单位为秒
  virtual double GetDuration() = 0;          // 获取总时长，单位为秒
  virtual bool SeekTo(double position) = 0;  // 设置播放进度，单位为秒
};

std::unique_ptr<Demuxer> CreateDemuxer();

class AudioDevice {
 public:
  AudioDevice() = default;
  virtual ~AudioDevice() = default;

  virtual bool Create(const AudioInfo& audio_info) = 0;
  virtual void Release() = 0;

  virtual void Start() = 0;
  virtual void Stop() = 0;

  virtual void SetData(std::span<uint8_t> data) = 0;
};

std::unique_ptr<AudioDevice> CreateAudioDevice();

}  // namespace fio66

#endif  // _FFMPEG_WRAPPER_SRC_FFMPEG_WARPPER_EXPORT_H_
